﻿using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Collections;

namespace Restarty_SIPO3.Class
{
    class Subor
    {
        
        private String suma;
        public String IDsuboru { get; set; }
        public String CastPSC { get; set; }
        public String MesiacRok { get; set; }
        public int SP { get; set; }
        public String HlavickaKod4 { get; set; }
        public int PocetKlientov { get; set; }
        public String Znamienko { get; set; }
        public String Stredisko { get; set; }
        public String CelkovaSuma
        {
            get
            {
                return suma.Replace(",", ".");
            }
            set
            {
                suma = value;
            }
        }
        public ArrayList PolePost { get; set; }
        
        public Subor()
        {
            PolePost = new ArrayList();
        }

        public Subor(Subor DataSubor)
        {
            this.IDsuboru = DataSubor.IDsuboru;
            this.CastPSC = DataSubor.CastPSC;
            this.MesiacRok = DataSubor.MesiacRok;
            this.SP = DataSubor.SP;
            this.HlavickaKod4 = DataSubor.HlavickaKod4;
            this.PocetKlientov = DataSubor.PocetKlientov;
            this.Znamienko = DataSubor.Znamienko;
            this.Stredisko = DataSubor.Stredisko;
            this.CelkovaSuma = DataSubor.CelkovaSuma;
        }
        internal void vlozHlavicku(string Riadok,String stredisko)
        {
            Riadok = Riadok.Remove(0, Riadok.IndexOf((char)0x09) + 1);
            CastPSC = Riadok.Substring(0, Riadok.IndexOf((char)0x09));
            Riadok = Riadok.Remove(0, Riadok.IndexOf((char)0x09) + 1);
            MesiacRok = Riadok.Substring(0, Riadok.IndexOf((char)0x09));
            Riadok = Riadok.Remove(0, Riadok.IndexOf((char)0x09) + 1);
            SP = int.Parse(Riadok.Substring(0, Riadok.IndexOf((char)0x09)));
            Riadok = Riadok.Remove(0, Riadok.IndexOf((char)0x09) + 1);
            HlavickaKod4 = Riadok;

            this.Stredisko = stredisko;
        }



        internal void vlozZakaznika(string Riadok)
        {
            Zakaznik tmpZak = new Zakaznik();
            Posta tmpPost = new Posta();
            Riadok = Riadok.ToString().Remove(0, Riadok.ToString().IndexOf((char)0x09) + 1);
            tmpZak.RajonID = Riadok.ToString().Substring(0, Riadok.ToString().IndexOf((char)0x09));
            if (zistiNeExistenciuPosty(tmpZak.RajonID) == -1)
                pridajPostu(tmpZak.RajonID);
            if (zistiNeExistenciuRajonu(tmpZak.RajonID)[1] == -1)
                pridajRajon(tmpZak.RajonID);
            Riadok = Riadok.ToString().Remove(0, Riadok.ToString().IndexOf((char)0x09) + 1);
            tmpZak.Kod = Riadok.ToString().Substring(0, Riadok.ToString().IndexOf((char)0x09));
            Riadok = Riadok.ToString().Remove(0, Riadok.ToString().IndexOf((char)0x09) + 1);
            tmpZak.Meno = Riadok.ToString().Substring(0, Riadok.ToString().IndexOf((char)0x09));
            Riadok = Riadok.ToString().Remove(0, Riadok.ToString().IndexOf((char)0x09) + 1);
            tmpZak.Ulica = Riadok.ToString().Substring(0, Riadok.ToString().IndexOf((char)0x09));
            Riadok = Riadok.ToString().Remove(0, Riadok.ToString().IndexOf((char)0x09) + 1);
            tmpZak.PSCMesto = Riadok.ToString().Substring(0, Riadok.ToString().IndexOf((char)0x09));
            Riadok = Riadok.ToString().Remove(0, Riadok.ToString().IndexOf((char)0x09) + 1);
            tmpZak.KontaktneStredisko = Riadok.ToString().Substring(0, Riadok.ToString().IndexOf((char)0x09));
            Riadok = Riadok.ToString().Remove(0, Riadok.ToString().IndexOf((char)0x09) + 1);
            tmpZak.Znamienko = Riadok.ToString().Substring(0, Riadok.ToString().IndexOf((char)0x09));
            Riadok = Riadok.ToString().Remove(0, Riadok.ToString().IndexOf((char)0x09) + 1);
            tmpZak.CelkovaSuma = Riadok.ToString().Substring(0, Riadok.ToString().IndexOf((char)0x09));
            Riadok = Riadok.ToString().Remove(0, Riadok.ToString().IndexOf((char)0x09) + 1);
            tmpZak.IDZakaznika = Riadok.ToString();
            int[] poloha = zistiNeExistenciuRajonu(tmpZak.RajonID);
            ((Rajon)((Posta)this.PolePost[poloha[0]]).Rajony[poloha[1]]).Zakaznici.Add(tmpZak);

            AktualZakRajon = tmpZak.RajonID;
        }

        private void pridajRajon(string Kod)
        {
            Rajon tmpRajon = new Rajon();
            tmpRajon.IDRajonu = Kod;
            ((Posta)PolePost[zistiNeExistenciuPosty(Kod)]).Rajony.Add(tmpRajon);
        }

        private int[] zistiNeExistenciuRajonu(string Kod)
        {
            Boolean[] neexistuje = { true, true };
            int PolohaPosta = 0;
            int PolohaRajon = 0;
            foreach (Posta tmpPost in PolePost)
            {
                foreach (Rajon tmpRajon in tmpPost.Rajony)
                {
                    if (Kod == tmpRajon.IDRajonu)
                    {
                        neexistuje[1] = false;
                        break;
                    }
                    PolohaRajon++;
                }

                
                if (Kod.Contains(tmpPost.IDPosty))
                {
                    neexistuje[0] = false;
                    break;
                }
                PolohaRajon = 0;
                PolohaPosta++;
            }
            if (neexistuje[1])
            {
                PolohaRajon = -1;
            }
            if (neexistuje[0])
            {
                PolohaRajon = -1;
            }
            int[] tmpInt = { PolohaPosta, PolohaRajon };
            return tmpInt;
        }

        private void pridajPostu(string Kod)
        {
            Posta tmpPost = new Posta();
            tmpPost.IDPosty = Kod.Substring(0, Kod.IndexOf("/")); ;
            PolePost.Add(tmpPost);
        }

        private int zistiNeExistenciuPosty(string Kod)
        {
            Boolean neexistuje = true;
            int poloha = 0;
            foreach (Posta tmpPost in PolePost)
            {
                if(Kod.Contains(tmpPost.IDPosty))
                {
                    neexistuje = false;
                    break;
                }
                poloha++;
            }
            if (neexistuje)
                poloha = -1;
            return poloha;
        }

        internal void vlozSluzbu(string Riadok)
        {
            int[] poloha = zistiNeExistenciuRajonu(AktualZakRajon);
            Sluzba tmpSluzba = new Sluzba();
            Riadok = Riadok.Remove(0, Riadok.IndexOf((char)0x09) + 1);
            tmpSluzba.KodSluzby = Riadok.Substring(0, Riadok.IndexOf((char)0x09));
            Riadok = Riadok.Remove(0, Riadok.IndexOf((char)0x09) + 1);
            tmpSluzba.NazovSluzby = Riadok.Substring(0, Riadok.IndexOf((char)0x09));
            Riadok = Riadok.Remove(0, Riadok.IndexOf((char)0x09) + 1);
            tmpSluzba.Znamienko = Riadok.Substring(0, Riadok.IndexOf((char)0x09));
            Riadok = Riadok.Remove(0, Riadok.IndexOf((char)0x09) + 1);
            tmpSluzba.CelkovaSuma = Riadok;
            int PoslednyZakaznik  = (((Rajon)((Posta)this.PolePost[poloha[0]]).Rajony[poloha[1]]).Zakaznici.Count-1);
            ((Zakaznik)((Rajon)((Posta)this.PolePost[poloha[0]]).Rajony[poloha[1]]).Zakaznici[PoslednyZakaznik]).Sluzby.Add(tmpSluzba);
        }

        internal void vlozPatu(string Riadok)
        {
            Riadok = Riadok.Remove(0, Riadok.IndexOf((char)0x09) + 1);
            this.PocetKlientov = int.Parse(Riadok.Substring(0, Riadok.IndexOf((char)0x09)));
            Riadok = Riadok.Remove(0, Riadok.IndexOf((char)0x09) + 1);
            this.Znamienko = Riadok.Substring(0, Riadok.IndexOf((char)0x09));
            Riadok = Riadok.Remove(0, Riadok.IndexOf((char)0x09) + 1);
            this.suma = Riadok;

            
        }

        internal void vlozRajon(string Riadok)
        {
            Rajon tmpRajon = new Rajon();
            Riadok = Riadok.Remove(0, Riadok.IndexOf((char)0x09) + 1);
            tmpRajon.IDRajonu = Riadok.Substring(0, Riadok.IndexOf((char)0x09));
            Riadok = Riadok.Remove(0, Riadok.IndexOf((char)0x09) + 1);
            tmpRajon.Kod = Riadok.Substring(0, Riadok.IndexOf((char)0x09));
            Riadok = Riadok.Remove(0, Riadok.IndexOf((char)0x09) + 1);
            tmpRajon.PocetKlientov = int.Parse(Riadok.Substring(0, Riadok.IndexOf((char)0x09)));
            Riadok = Riadok.Remove(0, Riadok.IndexOf((char)0x09) + 1);
            tmpRajon.Znamienko = Riadok.Substring(0, Riadok.IndexOf((char)0x09));
            Riadok = Riadok.Remove(0, Riadok.IndexOf((char)0x09) + 1);
            tmpRajon.CelkovaSuma = Riadok;
            
            int[] poloha = zistiNeExistenciuRajonu(tmpRajon.IDRajonu);
            if (poloha[0] == -1)
            {
                pridajPostu(tmpRajon.IDRajonu);
                ((Posta)this.PolePost[this.PolePost.Count - 1]).Rajony.Add(tmpRajon);
            }
            else
            {
                if (poloha[1] == -1)
                {
                    ((Posta)this.PolePost[poloha[0]]).Rajony.Add(tmpRajon);
                }
                else
                {
                    ((Rajon)((Posta)this.PolePost[poloha[0]]).Rajony[poloha[1]]).IDRajonu = tmpRajon.IDRajonu;
                    ((Rajon)((Posta)this.PolePost[poloha[0]]).Rajony[poloha[1]]).Kod = tmpRajon.Kod;
                    ((Rajon)((Posta)this.PolePost[poloha[0]]).Rajony[poloha[1]]).PocetKlientov = tmpRajon.PocetKlientov;
                    ((Rajon)((Posta)this.PolePost[poloha[0]]).Rajony[poloha[1]]).Znamienko = tmpRajon.Znamienko;
                    ((Rajon)((Posta)this.PolePost[poloha[0]]).Rajony[poloha[1]]).CelkovaSuma = tmpRajon.CelkovaSuma;
                }
            }
        }

        internal void vlozPostu(string Riadok)
        {
            Posta tmpPosta = new Posta();
            Riadok = Riadok.Remove(0, Riadok.IndexOf((char)0x09) + 1);
            tmpPosta.IDPosty = Riadok.Substring(0, Riadok.IndexOf((char)0x09));
            Riadok = Riadok.Remove(0, Riadok.IndexOf((char)0x09) + 1);
            tmpPosta.PocetKlientov = int.Parse(Riadok.Substring(0, Riadok.IndexOf((char)0x09)));
            Riadok = Riadok.Remove(0, Riadok.IndexOf((char)0x09) + 1);
            tmpPosta.Znamienko = Riadok.Substring(0, Riadok.IndexOf((char)0x09));
            Riadok = Riadok.Remove(0, Riadok.IndexOf((char)0x09) + 1);
            tmpPosta.CelkovaSuma = Riadok;

            int poloha = zistiNeExistenciuPosty(tmpPosta.IDPosty);

            if (poloha == -1)
            {
                this.PolePost.Add(tmpPosta);
            }
            else
            {
                ((Posta)this.PolePost[poloha]).IDPosty = tmpPosta.IDPosty;
                ((Posta)this.PolePost[poloha]).PocetKlientov = tmpPosta.PocetKlientov;
                ((Posta)this.PolePost[poloha]).Znamienko = tmpPosta.Znamienko;
                ((Posta)this.PolePost[poloha]).CelkovaSuma = tmpPosta.CelkovaSuma;
            }
        }

        public string AktualZakRajon { get; set; }
    }
}
